home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / libs / vogle / prev.lha / torus.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-03-11  |  1.8 KB  |  113 lines

  1. #include <math.h>
  2. #include <stdio.h>
  3. #include <vogle.h>
  4. #include "art.h"
  5. #include "macro.h"
  6. #include "gram.h"
  7. #include "poly.h"
  8.  
  9. extern attr    *astackp;
  10. extern mats    *mstackp;
  11. extern hlist    *fhlist;
  12. extern float    tolerance;
  13. extern int    lookatdone;
  14.  
  15. extern double    modrf();
  16.  
  17. /*
  18.  * torusinit
  19.  *
  20.  *    Draw a torus. The equation used is:
  21.  *
  22.  *         (x^2 + y^2 + z^2 + 1.0 - r^2)^2 - 4(x^2 + y^2) = 0.0.
  23.  *
  24.  * where r is between 0.0 and 1.0.
  25.  *
  26.  */
  27. void
  28. torusinit(o, d)
  29.     object    *o;
  30.     details *d;
  31. {
  32.     float    torad, ringrad, radius;
  33.     vector    cent;
  34.     details    *ld;
  35.     int    first;
  36.     float    delta, ang, dx, dy;
  37.  
  38.     if (!lookatdone)
  39.         deflookat();
  40.  
  41.     cent.x = cent.y = cent.z = 0.0;
  42.  
  43.     first = 1;
  44.  
  45.     while (d != (details *)NULL) {
  46.         switch (d->type) {
  47.         case CENTER:
  48.             cent = d->u.v;
  49.             break;
  50.         case RADII:
  51.             torad = d->u.v.x;
  52.             ringrad = d->u.v.y;
  53.             break;
  54.         case RADIUS:
  55.             if (first) {
  56.                 ringrad = d->u.f;
  57.                 first = 0;
  58.             } else
  59.                 torad = d->u.f;
  60.             break;
  61.         default:
  62.             warning("art: illegal field in torus ignored.\n");
  63.         }
  64.         ld = d;
  65.         d = d->nxt;
  66.         free(ld);
  67.     }
  68.  
  69.     pushmatrix();
  70.  
  71.         calctransforms(mstackp);
  72.         multmatrix(mstackp->obj2ray);
  73.  
  74.         translate(cent.x, cent.y, cent.z);
  75.  
  76.         /* 
  77.          * draw the latitudinal rings.
  78.          */
  79.         circle(0.0, 0.0, torad + ringrad);
  80.  
  81.         circle(0.0, 0.0, torad - ringrad);
  82.  
  83.         pushmatrix();
  84.             translate(0.0, 0.0, ringrad);
  85.  
  86.             circle(0.0, 0.0, torad);
  87.  
  88.             translate(0.0, 0.0, -2 * ringrad);
  89.  
  90.             circle(0.0, 0.0, torad);
  91.         popmatrix();
  92.  
  93.         /*
  94.          * draw the longitudinal rings
  95.          */
  96.  
  97.         delta = 180.0 / 10;
  98.  
  99.         for (ang = 0.0; ang < 360.0; ang += delta) {
  100.             pushmatrix();
  101.                 dx = torad * cos((double)ang * M_PI / 180.0);
  102.                 dy = torad * sin((double)ang * M_PI / 180.0);
  103.                 translate(dx, dy, 0.0);
  104.                 rotate(90.0, 'x');
  105.                 rotate(ang, 'y');
  106.                 circle(0.0, 0.0, ringrad);
  107.             popmatrix();
  108.  
  109.         }
  110.  
  111.     popmatrix();
  112. }
  113.